#include "code_comment_gen.h"
#include "code_comment_visitor.h"

void CodeCommentGenASTConsumer::HandleTranslationUnit(clang::ASTContext& Context)
{
    FuncCommentGenVisitor funcCommentVisitor(Context, mCodeCommentInfoManager);
    funcCommentVisitor.TraverseDecl(Context.getTranslationUnitDecl());
}

void CodeCommentGenASTConsumer::doWriteOut()
{

}

bool CodeCommentGenASTConsumer::VisitNamespaceDecl(const clang::NamespaceDecl *D)
{
    return true;
}

bool CodeCommentGenASTConsumer::VisitRecordDecl(const clang::RecordDecl *D)
{    
    return true;
}

bool CodeCommentGenASTConsumer::VisitEnumDecl(const clang::EnumDecl *D)
{
    return true;
}

bool CodeCommentGenASTConsumer::VisitCXXMethodDecl(const clang::CXXMethodDecl *D)
{
    return true;
}

bool CodeCommentGenASTConsumer::VisitFunctionDecl(const clang::FunctionDecl *D)
{    
    clang::comments::FullComment* comment = getComment(D, D->getASTContext());
    if(comment) {
        // comment->dump();
        return true;
    }
    return true;
}

clang::comments::FullComment* CodeCommentGenASTConsumer::getComment(const clang::NamedDecl *D,
                                    const clang::ASTContext &Context)
{
    clang::RawComment *Comment = Context.getRawCommentForDeclNoCache(D);
    // FIXME: Move setAttached to the initial comment parsing.
    if (Comment) {
        Comment->setAttached();
        return Comment->parse(Context, nullptr, D);
    }
    return nullptr;
}

llvm::StringRef CodeCommentGenASTConsumer::getCommentStr(const clang::NamedDecl *D, const clang::ASTContext &Context)
{
    clang::RawComment *Comment = Context.getRawCommentForDeclNoCache(D);
    if(Comment) {
        return Comment->getRawText(Context.getSourceManager());
    }
    return llvm::StringRef();
}
